/*
 * @Author: wuqingchun
 * @Date: 2024-07-16 09:00:06
 * @Description: C++临时对象对性能产生的影响
 * @LastEditors: wuqingchun
 * @LastEditTime: 2024-07-16 09:37:35
 */

#include <iostream>


// 有理数类定义
class Rational
{
public:
    // explicit Rational(int iNumerator=0, int iDenominator=1):
    Rational(int iNumerator=0, int iDenominator=1):
        m_iNumerator(iNumerator),
        m_iDenominator(iDenominator)
    {
        std::cout << this << ": " << __FUNCTION__ << std::endl;
    }

    Rational(const Rational& refRational)
    {
        m_iNumerator = refRational.m_iNumerator;
        m_iDenominator = refRational.m_iDenominator;

        std::cout << "Copy construct: "<< this << ": "<< __FUNCTION__ << std::endl;
    }

    ~Rational()
    {
        std::cout << this << ": " << __FUNCTION__ << std::endl;
    }

    // Rational& operator=(int iNumerator)
    // {
    //     std::cout << this << ": " << __FUNCTION__ << std::endl;
    //     m_iNumerator = iNumerator;
    //     m_iDenominator = 1;

    //     return *this;
    // }
private:
    int m_iNumerator;
    int m_iDenominator;
};

int main(int argc, char** argv)
{
    // 1、对象初始化时产生的临时对象
    // 只有第一种初始化形式可以保证编译器在执行过程中不会产生临时对象；
    // 使用第2种或者第3种形式，可能会产生临时对象，这依赖于编译器的实现
    // 然而实际上，大多数编译器会通过优化省去临时对象，所以此处给出的三种初始化形式的效率是等价的
    Rational objR1(100);              // 1
    Rational objR2 = Rational(100);   // 2
    Rational objR3 = 100;             // 3

    Rational objR4 = objR3;

    // 2、类型不匹配产生的临时对象
    // 类型不匹配时，编译器会执行隐式类型转换，生成临时对象
    // 解决方法一：使用 explicit 修饰，禁用隐式转换
    // 解决方法二：明确定义赋值运算符
    Rational objR5;
    objR5 = 100;           // 1 编译器先使用100构造Rational的临时对象，然后将临时对象赋值给objR5

    return 0;
}